package com.wande.dataplatform.filecollection.parser;

import com.wande.dataplatform.filecollection.domain.dto.FieldInfo;
import com.wande.dataplatform.filecollection.domain.dto.ParseResult;

import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;

/**
 * 文件解析器接口
 * 定义文件解析的核心方法，支持字段检测、批量解析和流式解析
 *
 * @author dataplatform
 * @date 2025-01-24
 */
public interface IFileParser {

    /**
     * 获取支持的文件类型
     *
     * @return 文件类型（如 CSV, XLS, XLSX, XML, JSON, SQL）
     */
    String getSupportedFileType();

    /**
     * 检测文件字段信息
     * 自动识别文件的列名和数据类型
     *
     * @param inputStream 文件输入流
     * @param config 解析器配置
     * @return 字段信息列表
     */
    List<FieldInfo> detectFields(InputStream inputStream, ParserConfig config);

    /**
     * 解析文件（批量模式）
     * 返回迭代器，支持逐行读取
     *
     * @param inputStream 文件输入流
     * @param config 解析器配置
     * @return 数据记录迭代器
     */
    Iterator<Map<String, Object>> parse(InputStream inputStream, ParserConfig config);

    /**
     * 流式解析文件（大文件模式）
     * 使用回调函数处理每条记录，避免内存溢出
     *
     * @param inputStream 文件输入流
     * @param config 解析器配置
     * @param consumer 数据消费者
     */
    void parseStream(InputStream inputStream, ParserConfig config, Consumer<Map<String, Object>> consumer);

    /**
     * 验证文件格式是否正确
     *
     * @param inputStream 文件输入流
     * @param config 解析器配置
     * @return 是否有效
     */
    default boolean validate(InputStream inputStream, ParserConfig config) {
        return true;
    }
}
